I. Background

II. Infile

library(readxl)
raw <- read_excel("data/온라인쇼핑몰_판매매체별_상품군별거래액_20190328095024.xlsx", sheet = "데이터")
raw[1:6,1:6]
## # A tibble: 6 x 6
##   상품군별           판매매체별 `2017. 01` `2017. 02` `2017. 03` `2017. 04`
##   <chr>              <chr>           <dbl>      <dbl>      <dbl>      <dbl>
## 1 합계               계            7310479    7148849    7747011    7380795
## 2 <NA>               인터넷쇼핑    3390183    3298823    3585449    3304819
## 3 <NA>               모바일쇼핑    3920295    3850025    4161562    4075976
## 4 컴퓨터 및 주변기기 계             422384     475342     473351     368280
## 5 <NA>               인터넷쇼핑     288391     329143     322089     251604
## 6 <NA>               모바일쇼핑     133993     146200     151262     116675

III. Preprocessing

Task 1: 상품군별의 NA 채워넣기

  • 따라해보기
  • 아래에서 x는 벡터를 zoo 타입으로 바꾸고 실행했는데,
  • 해당 stackoverflow의 아래 쪽 댓글을 읽어보면 zoo 타입으로 바꾸는 것이 필수적이지는 않습니다.
  • 즉, y와 같이 할 수도 있습니다.
library(zoo)
x <- zoo(c(2,NA,1,4,5,2))
na.locf(x)
## 1 2 3 4 5 6 
## 2 2 1 4 5 2
y <- c(2,NA,1,4,5,2)
na.locf(y)
## [1] 2 2 1 4 5 2
  • 우리 데이터에 적용하기
raw$상품군별 <- na.locf(raw$상품군별)
raw[1:6,1:6]
## # A tibble: 6 x 6
##   상품군별           판매매체별 `2017. 01` `2017. 02` `2017. 03` `2017. 04`
##   <chr>              <chr>           <dbl>      <dbl>      <dbl>      <dbl>
## 1 합계               계            7310479    7148849    7747011    7380795
## 2 합계               인터넷쇼핑    3390183    3298823    3585449    3304819
## 3 합계               모바일쇼핑    3920295    3850025    4161562    4075976
## 4 컴퓨터 및 주변기기 계             422384     475342     473351     368280
## 5 컴퓨터 및 주변기기 인터넷쇼핑     288391     329143     322089     251604
## 6 컴퓨터 및 주변기기 모바일쇼핑     133993     146200     151262     116675
  • 성공! 다음 단계로

Task 2: M51을 참고하여 tidy dataset으로 만들기

  • Year-Month를 나타내는 YM컬럼 생성하여 tidy하게 만드는 것이 목표
  • M51table4a와 모양이 유사합니다.
  • Trial and error의 과정을 거치다 보면 아래 명령어를 찾아낼 수 있습니다.
library(tidyverse)
my_tidy <- raw %>%
  gather(colnames(raw)[-(1:2)], key = "YM", value = "Revenue")
head(my_tidy)
## # A tibble: 6 x 4
##   상품군별           판매매체별 YM       Revenue
##   <chr>              <chr>      <chr>      <dbl>
## 1 합계               계         2017. 01 7310479
## 2 합계               인터넷쇼핑 2017. 01 3390183
## 3 합계               모바일쇼핑 2017. 01 3920295
## 4 컴퓨터 및 주변기기 계         2017. 01  422384
## 5 컴퓨터 및 주변기기 인터넷쇼핑 2017. 01  288391
## 6 컴퓨터 및 주변기기 모바일쇼핑 2017. 01  133993
tail(my_tidy)
## # A tibble: 6 x 4
##   상품군별   판매매체별 YM          Revenue
##   <chr>      <chr>      <chr>         <dbl>
## 1 기타서비스 계         2019. 01 p)   78617
## 2 기타서비스 인터넷쇼핑 2019. 01 p)   45390
## 3 기타서비스 모바일쇼핑 2019. 01 p)   33227
## 4 기타       계         2019. 01 p)  243517
## 5 기타       인터넷쇼핑 2019. 01 p)  118596
## 6 기타       모바일쇼핑 2019. 01 p)  124921

Task 3: YM 변수의 값을 깔끔하게 정리

  • head(my_tidy)tail(my_tidy)에서 YM 부분의 일관성이 떨어지는 것이 보입니다.
unique(my_tidy$YM)
##  [1] "2017. 01"    "2017. 02"    "2017. 03"    "2017. 04"    "2017. 05"   
##  [6] "2017. 06"    "2017. 07"    "2017. 08"    "2017. 09"    "2017. 10"   
## [11] "2017. 11"    "2017. 12"    "2018. 01"    "2018. 02"    "2018. 03"   
## [16] "2018. 04"    "2018. 05"    "2018. 06"    "2018. 07"    "2018. 08"   
## [21] "2018. 09"    "2018. 10"    "2018. 11"    "2018. 12 p)" "2019. 01 p)"
  • 아래 코드는 별로 어렵지 않죠?
my_tidy$YM <- paste(substr(my_tidy$YM, 1, 4), substr(my_tidy$YM, 7, 8), sep = "-")
unique(my_tidy$YM)
##  [1] "2017-01" "2017-02" "2017-03" "2017-04" "2017-05" "2017-06" "2017-07"
##  [8] "2017-08" "2017-09" "2017-10" "2017-11" "2017-12" "2018-01" "2018-02"
## [15] "2018-03" "2018-04" "2018-05" "2018-06" "2018-07" "2018-08" "2018-09"
## [22] "2018-10" "2018-11" "2018-12" "2019-01"

Task 4: YM도 생성

my_tidy <- my_tidy %>%
  mutate(Y = substr(YM, 1, 4) %>% as.numeric(),
         M = substr(YM, 6, 7) %>% as.numeric())
  • 아래 코드로도 가능합니다. (classical way)
my_tidy$Y <- as.numeric(substr(YM, 1, 4))
my_tidy$M <- as.numeric(substr(YM, 6, 7))
  • 확인
my_tidy %>% head()
## # A tibble: 6 x 6
##   상품군별           판매매체별 YM      Revenue     Y     M
##   <chr>              <chr>      <chr>     <dbl> <dbl> <dbl>
## 1 합계               계         2017-01 7310479  2017     1
## 2 합계               인터넷쇼핑 2017-01 3390183  2017     1
## 3 합계               모바일쇼핑 2017-01 3920295  2017     1
## 4 컴퓨터 및 주변기기 계         2017-01  422384  2017     1
## 5 컴퓨터 및 주변기기 인터넷쇼핑 2017-01  288391  2017     1
## 6 컴퓨터 및 주변기기 모바일쇼핑 2017-01  133993  2017     1

Task 5: Tidy dataset 완성 확인

my_tidy %>% str()
## Classes 'tbl_df', 'tbl' and 'data.frame':    1800 obs. of  6 variables:
##  $ 상품군별  : chr  "합계" "합계" "합계" "컴퓨터 및 주변기기" ...
##  $ 판매매체별: chr  "계" "인터넷쇼핑" "모바일쇼핑" "계" ...
##  $ YM        : chr  "2017-01" "2017-01" "2017-01" "2017-01" ...
##  $ Revenue   : num  7310479 3390183 3920295 422384 288391 ...
##  $ Y         : num  2017 2017 2017 2017 2017 ...
##  $ M         : num  1 1 1 1 1 1 1 1 1 1 ...
  • 이제 전처리가 끝났습니다. 변수의 순서를 바꾸고 정렬하여 dataset이라는 이름을 붙여주고 분석을 진행해보겠습니다.
dataset <- my_tidy %>%
  select(YM, Y, M, 상품군별, 판매매체별, Revenue) %>% 
  arrange(YM, Y, M, 상품군별, 판매매체별, Revenue)
head(dataset)
## # A tibble: 6 x 6
##   YM          Y     M 상품군별    판매매체별 Revenue
##   <chr>   <dbl> <dbl> <chr>       <chr>        <dbl>
## 1 2017-01  2017     1 e쿠폰서비스 계           88648
## 2 2017-01  2017     1 e쿠폰서비스 모바일쇼핑   74432
## 3 2017-01  2017     1 e쿠폰서비스 인터넷쇼핑   14216
## 4 2017-01  2017     1 가구        계          188602
## 5 2017-01  2017     1 가구        모바일쇼핑  105397
## 6 2017-01  2017     1 가구        인터넷쇼핑   83204

IV. 판매매체별분석 (계, 모바일쇼핑, 인터넷쇼핑)

head(dataset)
## # A tibble: 6 x 6
##   YM          Y     M 상품군별    판매매체별 Revenue
##   <chr>   <dbl> <dbl> <chr>       <chr>        <dbl>
## 1 2017-01  2017     1 e쿠폰서비스 계           88648
## 2 2017-01  2017     1 e쿠폰서비스 모바일쇼핑   74432
## 3 2017-01  2017     1 e쿠폰서비스 인터넷쇼핑   14216
## 4 2017-01  2017     1 가구        계          188602
## 5 2017-01  2017     1 가구        모바일쇼핑  105397
## 6 2017-01  2017     1 가구        인터넷쇼핑   83204
library(ggplot2)
library(plotly)
options(scipen=999) # Avoid scientific expression e.g.) 1e+05
unique(dataset$상품군별)
##  [1] "e쿠폰서비스"          "가구"                 "가방"                
##  [4] "가전·전자·통신기기" "기타"                 "기타서비스"          
##  [7] "농축수산물"           "문화 및 레저서비스"   "사무·문구"          
## [10] "생활용품"             "서적"                 "스포츠·레저용품"    
## [13] "신발"                 "아동·유아용품"       "애완용품"            
## [16] "여행 및 교통서비스"   "음·식료품"           "음식서비스"          
## [19] "의복"                 "자동차용품"           "컴퓨터 및 주변기기"  
## [22] "패션용품 및 액세서리" "합계"                 "화장품"
fig1 <- ggplot(dataset %>% filter(상품군별=="합계"), 
               aes(x = YM, y = Revenue, color = 판매매체별)) + 
  geom_point() + 
  geom_line(aes(group = 판매매체별)) +
  labs(x = "", title = "온라인 매출 동향 (단위: 백만원)") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) 
fig1 %>% ggplotly()
fig2 <- ggplot(dataset, 
               aes(x = YM, y = Revenue, color = 판매매체별)) + 
  geom_point() + 
  geom_line(aes(group = 판매매체별)) +
  labs(x = "", title = "온라인 매출 동향 (단위: 백만원)") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  facet_wrap(~ 상품군별)
ggsave(plot = fig2, filename = "data/fig2.png", dpi = 300, width = 20, height = 10)

fig2b <- fig2 + facet_wrap(~ 상품군별, scales = "free_y", ncol = 2) # google: "facet to have different y axis"
ggsave(plot = fig2b, filename = "data/fig2b.png", dpi = 300, width = 8, height = 24)

V.

VI.

X. 작업중 + Appendix + 미완

참고. 목적에 따른 테이블 변환

dataset2 <- dataset %>% spread(key = "판매매체별", value = "Revenue")
head(dataset2)
## # A tibble: 6 x 7
##   YM          Y     M 상품군별               계 모바일쇼핑 인터넷쇼핑
##   <chr>   <dbl> <dbl> <chr>               <dbl>      <dbl>      <dbl>
## 1 2017-01  2017     1 e쿠폰서비스         88648      74432      14216
## 2 2017-01  2017     1 가구               188602     105397      83204
## 3 2017-01  2017     1 가방               143643      99665      43978
## 4 2017-01  2017     1 가전·전자·통신기기 602122     294626     307496
## 5 2017-01  2017     1 기타               144492      57713      86780
## 6 2017-01  2017     1 기타서비스          65597      23788      41810